package com.webxp.DB;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;

/**
 * 数据库连接池
 * 
 * @author hdg1988
 * 
 */
public class DBConnectionPool {

	/**
	 * 日志
	 */
	private static org.apache.log4j.Logger logger = org.apache.log4j.Logger
			.getLogger("DBConnectionPool.java");

	/**
	 * 数据库连接
	 */
	private Connection con = null;

	/**
	 * 正在使用的连接数
	 */
	private int nUsed = 0;

	/**
	 * 空闲的连接数
	 */
	private ArrayList freeCons = new ArrayList();

	/**
	 * 最小连接数
	 */
	private int minConn;

	/**
	 * 最大连接数
	 */
	private int maxConn;

	/**
	 * 连接池的名字
	 */
	private String sName;

	/**
	 * 连接用户名
	 */
	private String sUserName;

	/**
	 * 连接密码
	 */
	private String sPassword;

	/**
	 * 连接地址
	 */
	private String sUrl;

	/**
	 * 数据库驱动
	 */
	private String sDriver;
	
	private long timer=1000;

	public DBConnectionPool() {

	}

	/**
	 * 构造函数
	 * 
	 * @param _sName
	 * @param _sDriver
	 * @param _sUrl
	 * @param _sUserName
	 * @param _sPassword
	 * @param _maxConn
	 */
	public DBConnectionPool(String _sName, String _sDriver, String _sUrl,
			String _sUserName, String _sPassword, int _maxConn, int _minCon) {
		this.sName = _sName;
		this.sDriver = _sDriver;
		this.sUrl = _sUrl;
		this.sUserName = _sUserName;
		this.sPassword = _sPassword;
		this.maxConn = _maxConn;
		this.minConn = _minCon;
	}
	
	/**
	 * 系统初始化，创建最小连接数
	 */
	public synchronized void init() {
		if (this.nUsed != 0 || this.freeCons.size() != 0)
			return;
		for (int i = 0; i < this.minConn; i++)
			this.freeCons.add(this.newConnection());
	}

	/**
	 * 释放某个连接
	 * 
	 * @param con
	 */
	public synchronized void freeConnection(Connection con) {
		this.freeCons.add(con);
		this.nUsed--;
	}

	/**
	 * 获取一个连接，从连接池中获取
	 * 
	 * @param timeout
	 * @return
	 */
	public synchronized Connection getConnection(long timeout) {
		Connection con = null;
		logger.info("正在获取连接...");
		if (this.freeCons.size() > 0) {
			con = (Connection) this.freeCons.get(0);
			if (con == null)
				con = getConnection(timeout);
		} else {
			con = newConnection();
		}
		if (this.maxConn == 0 || this.maxConn < this.nUsed)
			con = null;
		if (con != null)
			this.nUsed++;
		return con;
	}
	
	/**
	 * 默认的时间内容重新连接
	 * @return
	 */
	public synchronized Connection getConnection(){
		return this.getConnection(this.timer);
	}

	/**
	 * 创建一个连接
	 * 
	 * @return
	 */
	public Connection newConnection() {
		try {
			Class.forName(this.sDriver);
			this.con = DriverManager.getConnection(this.sUrl, this.sUserName,
					this.sPassword);
		} catch (ClassNotFoundException e) {
			logger.error("没有找到数据库驱动类~~", e);
		} catch (SQLException e1) {
			logger.error("数据库失败！", e1);
		}
		return con;
	}

	/**
	 * 释放所有连接
	 */
	public synchronized void release() {
		Iterator allConns = this.freeCons.iterator();
		while (allConns.hasNext()) {
			Connection con = (Connection) allConns.next();
			try {
				con.close();
			} catch (SQLException e) {
				logger.error("关闭数据库连接失败~~", e);
			}
		}
		this.freeCons.clear();
	}

	public synchronized void TimerEvent() {

	}

	/**
	 * 获取驱动
	 * 
	 * @return
	 */
	public String getDriver() {
		return this.sDriver;
	}

	/**
	 * 设置驱动
	 * 
	 * @param sDriver
	 */
	public void setDriver(String sDriver) {
		this.sDriver = sDriver;
	}

	/**
	 * 获取最大连接数
	 * 
	 * @return
	 */
	public int getMaxConn() {
		return this.maxConn;
	}

	/**
	 * 设置最大连接数
	 * 
	 * @param _maxNum
	 */
	public void setMaxConn(int _maxNum) {
		this.maxConn = _maxNum;
	}

	/**
	 * 获取最小连接数
	 * 
	 * @return
	 */
	public int getMinConn() {
		return this.minConn;
	}

	/**
	 * 设计最小连接数
	 * 
	 * @param minNum
	 */
	public void setMinConn(int minNum) {
		this.minConn = minNum;
	}

	/**
	 * 获取本连接池的名字
	 * 
	 * @return
	 */
	public String getName() {
		return this.sName;
	}

	/**
	 * 设置连接池的名字
	 * 
	 * @param _sName
	 */
	public void setName(String _sName) {
		this.sName = _sName;
	}

	/**
	 * 获取连接时的用户名
	 * 
	 * @return
	 */
	public String getUserName() {
		return this.sUserName;
	}

	/**
	 * 设置连接时的用户名
	 * 
	 * @param userName
	 */
	public void setUserName(String userName) {
		this.sUserName = userName;
	}

	/**
	 * 获取连接时的密码
	 * 
	 * @return
	 */
	public String getPassword() {
		return this.sPassword;
	}

	/**
	 * 设置连接时的密码
	 * 
	 * @param sPw
	 */
	public void serPassword(String sPw) {
		this.sPassword = sPw;
	}

	/**
	 * 获取连接地址
	 * 
	 * @return
	 */
	public String getUrl() {
		return this.sUrl;
	}

	/**
	 * 设置连接地址
	 * 
	 * @param sUrl
	 */
	public void setUrl(String sUrl) {
		this.sUrl = sUrl;
	}
	public ArrayList getFreeCon(){
		return this.freeCons;
	}
}
